<?php
	/**
	 * Klass REGISTER HANDLER - Hanterar in och ut data gällande registrering av en ny kund.
	 * "Pratar" med databasen och hämtar ut/sätter in information där ifrån och ger tillbaka den informationen till controllern eller view. 
	 */	 
	class RegisterHandler {
		
		private $database = null;
		private $validate = null;

		//----- FUNKTION: CONSTRUCT ----------------------------------------------------------------------------------------
		/**
		* Konstruktor funktion som lägger till en databas i vår privata variabel $database och lägger till en validate i vår privata variabel $validate.
		* @param Database $database Databasen.
		* @param Validate $validate Vår validator.
		*/
		public function __construct(Database $database, Validate $validate)
		{
			$this->database = $database;
			$this->validate = $validate;
		}


		//----- FUNKTION: INSERT CUSTOMER TO CUSTOMER TABLE ----------------------------------------------------------------------------------------
		/**
		* Funktion som sätter in kunden i kund tabellen i databasen.
		* @param string $customer Innehåller customer-objektet.
		* @return int $insertCustomerID Retunerar den insatta kundens ID.
		* @return bool true/false
		*/
		public function InsertCustomerToCustomerTable($customer)
		{
			$query = "INSERT INTO customer (CustomertypeID, Name, OrganisationId) VALUES(?, ?, ?)";
			if($insertStatement = $this->database->PrepareQuery($query)){
				$CustomertypeID = $customer->customerTypeID;
				$Name = $customer->name;
				$OrganisationId = $customer->organisationsId;
				$insertStatement->bind_param("iss", $CustomertypeID, $Name, $OrganisationId);

				$insertCustomerID = $this->database->Insert($insertStatement);				
				return $insertCustomerID;
			}
			return false;
		}


		//----- FUNKTION: INSERT CUSTOMER TO LOGIN TABLE ----------------------------------------------------------------------------------------
		/**
		* Funktion som sätter in kunden i login tabellen i databasen.
		* @param string $login Innehåller login-objektet.
		* @return int $insertLoginID Retunerar den insatta kundens login ID.
		* @return bool true/false
		*/
		public function InsertCustomerToLoginTable($login)
		{
			$query = "INSERT INTO login (CustomerID, LoginName, LoginPassword, LoginAdmin) VALUES(?, ?, ?, ?)";
			if($insertStatement = $this->database->PrepareQuery($query)){
				$CustomerID = $login->CustomerID;
				$LoginName = $login->LoginName;
				$LoginPassword = $login->LoginPassword;
				$LoginAdmin = $login->LoginAdmin;
				$insertStatement->bind_param("issi", $CustomerID, $LoginName, $LoginPassword, $LoginAdmin);

				$insertLoginID = $this->database->Insert($insertStatement);				
				return $insertLoginID;
			}
			return false;
		}


		//----- FUNKTION: INSERT CUSTOMER INFO TO CONTACT TABLE ----------------------------------------------------------------------------------------
		/**
		* Funktion som lägger en kund kontakt uppgifter i databasen.
		* @param string $contact Innehåller ett contact-objekt med all information som ska in i databasen.
		* @return int $insertContactID Retunerar den nya kundens kontakt ID.
		* @return bool true/false
		*/
		public function InsertCustomerInfoToContactTable($contact)
		{
			$query = "INSERT INTO contact (ContacttypeID, CustomerID, ContactValue) VALUES(?, ?, ?)";
			if($insertStatement = $this->database->PrepareQuery($query)){
				$ContacttypeID = $contact->contactTypeID;
				$CustomerID = $contact->customerID;
				$ContactValue = $contact->contactValue;
				$insertStatement->bind_param("iis", $ContacttypeID, $CustomerID, $ContactValue);

				$insertContactID = $this->database->Insert($insertStatement);				
				return $insertContactID;
			}
			return false;
		}


		//----- FUNKTION: DATA VALIDATOR ----------------------------------------------------------------------------------------
		/**
		* Funktion för att validera all indata som ska skickas till databasen vid registering av en ny användare.
		* @param string $username Innehåller det användarnamnet som ska valideras.
		* @param string $mail Innehåller den mail som ska valideras.
		* @param string $password Innehåller det lösenordet som ska valideras.
		* @param string $repeatPassword Innehåller det repeterade lösenordet som ska valideras.
		* @return array $errorMessagesNumber Innehåller de felmeddelanderna som valideringen har gett upphov till.
		*/
		public function DataValidator($customername, $onr, $customertype, $adress, $postalcode, $city, $phone, $mail, $username, $password, $repeatPassword)
		{
			$messagesNumber = array();

			// Kontrollerar om lösenordet är längre än 6 tecken och inte innehåller några otillåtna tecken.
			if($this->validate->ValidatePassword($password) == false){
				if (strlen($password) == 0 || $password == ""){
					$messagesNumber[] = RegisterView::EMPTY_PASSWORD;	
				} else if (strlen($password) < 6) {
					$messagesNumber[] = RegisterView::SHORT_PASSWORD;
				} else {
					$messagesNumber[] = RegisterView::WRONG_FORMAT_PASSWORD;
				}
			}

			// Kontrollerar om användarnamnet är längre än 5 tecken och inte innehåller några otillåtna tecken.
			if($this->validate->ValidateUsername($username) == false){
				if (strlen($username) == 0 || $username == ""){
					$messagesNumber[] = RegisterView::EMPTY_USERNAME;	
				} else if (strlen($username) < 5) {
					$messagesNumber[] = RegisterView::SHORT_USERNAME;
				} else {
					$messagesNumber[] = RegisterView::WRONG_FORMAT_USERNAME;
				}
			}

			// Kontrollerar om mailen är i ett korrekt format. 
			if (strlen($mail) == 0 || $mail == ""){
				$messagesNumber[] = RegisterView::EMPTY_MAIL;	
			} else if($this->validate->ValidateMail($mail) == false){
				$messagesNumber[] = RegisterView::WRONG_FORMAT_MAIL;
			}

			// Kontrollerar att det repeterade lösenordet är likadant som det angivna lösenordet.
			if (strlen($repeatPassword) == 0 || $repeatPassword == ""){
				$messagesNumber[] = RegisterView::EMPTY_REPEAT_PASSWORD;	
			} else if($password != $repeatPassword){
				$messagesNumber[] = RegisterView::WRONG__FORMAT_REPEAT_PASSWORD;
			}

			// Kontrollerar om kundnamnet är i ett korrekt format. 
			if (strlen($customername) == 0 || $customername == ""){
				$messagesNumber[] = RegisterView::EMPTY_CUSTOMERNAME;	
			} else if($this->validate->ValidateCustomername($customername) == false){
				$messagesNumber[] = RegisterView::WRONG_FORMAT_CUSTOMERNAME;
			} 

			// Kontrollerar om organisationsnummret är i ett korrekt format. 
			if (strlen($onr) == 0 || $onr == ""){
				$messagesNumber[] = RegisterView::EMPTY_ORGANISATIONID;	
			} else if($this->validate->ValidateOrganisationID($onr) == false){
				$messagesNumber[] = RegisterView::WRONG_FORMAT_ORGANISATIONID;
			}

			// Kontrollerar om postnummret är i ett korrekt format. 
			if (strlen($postalcode) == 0 || $postalcode == ""){
				$messagesNumber[] = RegisterView::EMPTY_POSTALCODE;	
			} else if($this->validate->ValidatePostalcode($postalcode) == false){
				$messagesNumber[] = RegisterView::WRONG_FORMAT_POSTALCODE;
			}

			// Kontrollerar om telefonen är i ett korrekt format. 
			if (strlen($phone) == 0 || $phone == ""){
				$messagesNumber[] = RegisterView::EMPTY_PHONE;
			} else if($this->validate->ValidatePhone($phone) == false){
				$messagesNumber[] = RegisterView::WRONG_FORMAT_PHONE;
			}

			// Kontrollerar adress fältet är tomt. 
			if(strlen($adress) == 0 || $adress == ""){
				$messagesNumber[] = RegisterView::EMPTY_ADRESS;
			}

			// Kontrollerar stad fältet är tomt.
			if(strlen($city) == 0 || $city == ""){
				$messagesNumber[] = RegisterView::EMPTY_CITY;
			}

			// Användarnamnet är upptaget.
			if($this->OccupiedUsername($username) == true){
				$messagesNumber[] = RegisterView::USERNAME_TAKEN;
			}
			return $messagesNumber;			
		}


		//----- FUNKTION: OCCUPIED USER NAME ----------------------------------------------------------------------------------------
		/**
		* Funktion för att kontrollera om användarnamnet som försöker registreras är upptaget.
		* @param string $username Innehåller det användarnamnet som försöker registreras.
		* @return bool Retunerar true om användarnamnet är upptaget, annars false.
		*/
		public function OccupiedUsername($username)
		{
			$query = "SELECT LoginName FROM login WHERE LoginName = ?";
			if ($statement = $this->database->PrepareQuery($query)) {

				$statement->bind_param("s", $username);
				$statement = $this->database->Select($statement);

				$statement->bind_result($database_userName);
				$statement->fetch();
				
				// Om vi har fler än 0 rader så är användarnamnet upptaget.
				if ($statement->num_rows > 0) {
					return true;					

				} else{
					return false;
				}				
			}
			return false;
		}
	}	
?>